package com.taxsearch.controller;

import com.taxsearch.dao.TokenMapper;
import com.taxsearch.service.TestService;
import com.taxsearch.util.ApiJsonErr;
import com.taxsearch.util.ApiJsonRet;
import com.taxsearch.util.Json;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;

import io.jsonwebtoken.Jwts;
import io.jsonwebtoken.SignatureAlgorithm;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.util.StreamUtils;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;

import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;
import java.util.*;
import java.util.concurrent.TimeUnit;

/**
 * @description:获取token以及相关测试
 * @author: 杜一平
 * @create: 2018年8月13日-上午9:45:34
 **/
@Controller
@RequestMapping("/HotelAndroid")
public class TokenController {

    private Json json;

    @Autowired
    private TokenMapper tokenMapper;

    @Resource
    private TestService testService;

    Object result;


    @RequestMapping("/testJson.do")
    @ResponseBody
    public Object testJson(HttpServletRequest request) {

        List<Map<String, String>> list = new ArrayList<>();
        Map<String, String> map = new HashMap<>();

        map.put("name", "小明");
        map.put("id", "1");

        list.add(map);
        list.add(map);
        list.add(map);

        return list;
    }

    @RequestMapping("/aaa.do")
    @ResponseBody
    public Json test1() {
        try {
//			String str = null;
//			System.out.println(str.charAt(0));

            Json json = new Json();
            List<HashMap<String, String>> list = tokenMapper.selectUser("123",
                    "123");
            json.setObj(list);
            json.setMsg("1000");
            json.setSuccess(true);
            return json;
        } catch (Exception e) {
            System.out.println("异常信息:");
//            e.printStackTrace();           
        }
        return json;
    }

    @RequestMapping(value = "/token")
    @ResponseBody
    public Json token(HttpServletRequest request) {
        try {
            byte[] requestBody = StreamUtils.copyToByteArray(request.getInputStream());
            JSONObject jsonObject = JSON.parseObject((new String(requestBody, "UTF-8")));
            final String authHeader = jsonObject.getString("HangXinAuthToken");
            String cgString = "1112";
            Json json = new Json();
            json.setObj("成功");
            json.setMsg("1000");
            json.setSuccess(true);
            return json;
        } catch (NullPointerException e) {
            e.printStackTrace();
            // TODO: handle exception
        } catch (Exception e) {
            e.printStackTrace();
            // TODO: handle exception
        }
        return json;
    }

    /**
     * 获取token，更新token
     *
     * @param appId     用户编号
     * @param appSecret 用户密码
     * @return
     */
//	@RequestMapping(value = "/getToken", method = { RequestMethod.POST,
//			RequestMethod.GET })
    @RequestMapping(value = "/getToken")
    @ResponseBody
    public Object getToken(String id, String secret) {
        if (juedeNull(id) || juedeNull(secret)) {
            return new ApiJsonErr("请输入正确的用户名和密码！");
        } else {
            // 由于无法获取密码暂时搁置
            // 根据id查询用户实体
            List<HashMap<String, String>> list = tokenMapper.selectUser(id,
                    secret);
            // 如果数据库没有查找到数据
            if (list.size() == 0) {
                result = new ApiJsonErr("用户名或密码错误！");
            } else {
                //检测数据库是否存在该appId的token值
                List<HashMap<String, String>> tokenList = tokenMapper
                        .selectToken(id);
                // 返回token值
                String tokenStr = null;
                // 返回newToken
                if (tokenList.size() == 0) {
                    // 生成jwt,Token
                    tokenStr = createNewToken(id);
                    // 将token保持到数据库
                    Map<String, String> map = new HashMap<>();
                    map.put("id", id);
                    map.put("token", tokenStr);
                    tokenMapper.insertToken(map);
                }
                // 不超时 -> 直接返回dbToken
                // 超时 -> 生成newToken -> 更新dbToken -> 更新内存Token -> 返回newToken
                else {
                    // 判断数据库中token是否过期，如果没有过期不需要更新直接返回数据库中的token即可
                    // 数据库中生成时间
                    long dbBuildTime = Long.valueOf(System.currentTimeMillis());
                    // 当前时间
                    long currentTime = System.currentTimeMillis();
                    // 如果当前时间 - 数据库中生成时间 < 7200 证明可以正常使用
                    long second = TimeUnit.MILLISECONDS.toSeconds(currentTime
                            - dbBuildTime);
                    if (second > 0 && second < 7200) {
                        tokenStr = new String(tokenList.get(0).get("token"));
                    }
                    // 超时
                    else {
                        // 生成newToken
                        tokenStr = createNewToken(id);
                        // 执行更新
                        Map<String, String> updateMap = new HashMap<>();
                        updateMap.put("id", id);
                        updateMap.put("token", tokenStr);
                        tokenMapper.updateToken(updateMap);
                    }
                }
                System.out.println("获取token" + tokenStr);
                // 设置返回json
                result = new ApiJsonRet("200", tokenStr);
            }

//			// 生成简易版token,没有安全校验
//			// 生成newToken
//			String tokenStr = createNewToken(id);	
//			result = new ApiJsonRet("200", tokenStr);
        }
        return result;
    }


    /**
     * @throws
     * @Title: juedeNull
     * @Description: 判断字符串 是否是空串
     * @param: @param s
     * @param: @return
     * @return: boolean
     */
    public static boolean juedeNull(String s) {
        if (s == null || s.trim() == "") {
            return true;
        }
        return false;
    }

    /**
     * 创建新token
     *
     * @param appId
     * @return
     */
    private String createNewToken(String id) {
        // 获取当前时间
        Date now = new Date(System.currentTimeMillis());
        // 过期时间
        Date expiration = new Date(now.getTime() + 7200000 * 12);
        return Jwts
                .builder()
                .setSubject(id)
                // .claim(YAuthConstants.Y_AUTH_ROLES, userDbInfo.getRoles())
                .setIssuedAt(now).setIssuer("Online YAuth Builder")
                .setExpiration(expiration)
                .signWith(SignatureAlgorithm.HS256, "HangXinAuthv1.0.0")
                .compact();
    }
}
